


import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;

import static java.awt.Color.red;

// Color bgColor = new Color(255, 255, 255);
//        panelTop.setBackground(bgColor);
public class MainFrame extends JFrame {
    private Snake snake; //蛇
    private JPanel jPanel; //游戏棋盘
    private Timer timer; //定时器，在规定的时间内调用蛇移动的方法
    private Node food; //食物，一个node对象，表示的就是一个点

    public MainFrame() throws HeadlessException {
        //初始化窗体参数

        initFrame();
        //初始化游戏棋盘
        initGamePanel();
        //初始化蛇
        initSnake();
        //初始化食物
        initFood();
        //初始化定时器
        initTimer();
        //设置键盘监听，让蛇随着上下左右方向移动，实现键盘上的操作与游戏窗口指令相联系
        setKeyListener();

    }
/*    public void initJPanel(){
        Color bgColor = new Color(100, 255, 255);
        jPanel.setBackground(bgColor);
    };*/
    //初始化食物
    private void initFood() {
        food=new Node();
        food.random();
    }

    //设置键盘监听
    private void setKeyListener() {
        addKeyListener(new KeyAdapter() {// addKeyListener是就jframe的一个方法，而里面的KeyAdapter是一个新的类，这里创建了一个新的类作为它的子类
            //当键盘按下时，会自动掉此方法
            @Override
            public void keyPressed(KeyEvent e) {
                //键盘中的一个键都有一个编号
                switch (e.getKeyCode()){

                    case KeyEvent.VK_UP: //上键
                        if(snake.getDirection()!=Direction.DOWN){//通过if语句进行判断，就是当前蛇如果是往上走的那么按了down建就没有效果，下面也是同样的道理
                            snake.setDirection(Direction.UP);
                        }
                        break;
                    case KeyEvent.VK_DOWN: //下键

                        if(snake.getDirection()!=Direction.UP){
                            snake.setDirection(Direction.DOWN);
                        }
                        break;
                    case KeyEvent.VK_LEFT: //左键
                        if(snake.getDirection()!=Direction.RIGHT){
                            snake.setDirection(Direction.LEFT);
                        }
                        break;
                    case KeyEvent.VK_RIGHT: //右键
                        if(snake.getDirection()!=Direction.LEFT){
                            snake.setDirection(Direction.RIGHT);
                        }
                        break;
                }
            }
        });
    }

    //初始化定时器
    private void initTimer() {
        //创建定时器对象
        timer=new Timer();
        //初始化定时任务
        TimerTask timerTask=new TimerTask() {
            @Override
            public void run() {
                snake.move();//表示蛇动了一次
                //判断蛇头是否和食物重合
                Node head = snake.getBody().getFirst();
                if(head.getX()==food.getX()&&head.getY()==food.getY()){//每动一步之后都要进行一次判断，看蛇是不是已经吃到食物了，吃到了就调用
                    //sanke里面的eat方法将食物的点加到sanke的LinkedList集合里面，再把food点用random方法进行更新
                    snake.eat(food);//调用到了snake变量的一个方法
                    int v=snake.getSum();
                    v+=1;
                    snake.setSum(v);
                    food.random();//吃完食物之后要重新生成一个随机的随机的食物
                }
                //重绘游戏棋盘,更新棋盘的界面
                jPanel.repaint();
            }
        };

        //每100毫秒，执行一次定时任务
        timer.scheduleAtFixedRate(timerTask,1000,100);//注意前面的delay设计的是游戏窗口打开之后隔多之后蛇才
        //开始动，而第二个是蛇没走一步隔多长时间，这两个的单位都是毫秒
    }

    private void initSnake() {
        snake=new Snake();
    }

    //初始化游戏棋盘
    private void initGamePanel() {
            jPanel=new JPanel(){
                //清空棋盘
                //绘制游戏棋盘中的内容
                @Override
                public void paint(Graphics g) {
                    //g.drawImage(bgimage.bg,0,0,null);
                    //this.setBackground(Color.darkGray);//
                    g.setColor(Color.green);
                    //Color bgColor = new Color(100, 255, 255);
                    setBackground(red);
                    //.setBackground(Color.black);
                    g.clearRect(0,0,600,600);
                    //这里是绘制打开窗口的横线和竖线的
                    //Graphics g 可以看做是一个画笔，它提供了很多方法可以来绘制一些基本的图形（直线、矩形）
                    //绘制40条横线

                    //g.drawImage("img.png",200,200,600,600,null);

                    for (int i = 0; i <=40; i++) {
                        g.drawLine(0,i*15,600,i*15);
                    }
                    //绘制40条竖线  第n条： （n*15,0）		(n*15,600)
                    for (int i = 0; i <=40; i++) {
                        g.drawLine(i*15,0,i*15,600);
                    }


                    //绘制蛇
                    LinkedList<Node> body = snake.getBody();
                    for (Node node : body) {
                        g.fillRect(node.getX()*15,node.getY()*15,15,15);
                    }

                    //绘制食物
                    g.fillRect(food.getX()*15,food.getY()*15,15,15);
                    if(snake.isLiving()==false){

                        g.setColor(red);//设置画笔的颜色
                        g.setFont(new Font("楷体", Font.BOLD, 40));//设置字体样式
                        g.drawString("game over！", 200, 200);
                        g.drawString("您本局游戏的得分为："+snake.getSum()*10+"分", 50, 300);

                    }
                }
            };

            //把棋盘添加到船体中
            add(jPanel);

    }

    //初始化窗体参数
    private void initFrame() {
        //设置窗口的标题

        setTitle("贪吃蛇(极简版)");
        //设置窗体宽高
        setSize(610,640);
        //设置窗体的位置
        setLocation(200,200);
        //设置关闭按钮的作用（退出程序）
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体大小不可变，就不能通过鼠标拉动来改变窗口的大小
        setResizable(false);
        //setBackground(Color.DARK_GRAY);//设置为灰色
        //getContentPane().setVisible(false);//设置上面默认的白色contentpane为不可见，这样就可以看到我们设置的颜色了
        //但这样的话我创建的jpanl也会看不到了
        //换一种思路
        getContentPane().setBackground(Color.darkGray);
    }
    public void gamestart(){
        //创建窗体对象，并显示
        JFrame frame = new JFrame("小小贪吃蛇");
        frame.setBounds(200,200,600,600);
        frame.setResizable(false);
        //frame.setVisible(true);
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container ct;
        //创建背景面板。
        BackgroundPanel bgp;
        ct=frame.getContentPane();
        frame.setLayout(null);
        //在这里随便找一张400*300的照片既可以看到测试结果。
        bgp=new BackgroundPanel((new ImageIcon("src/images/background.jpg")).getImage());
        bgp.setBounds(0,0,600,580);
        ct.add(bgp);

        //创建按钮
        //jb=new JButton("测试按钮");
        //jb.setBounds(60,30,160,30);
        //ct.add(jb);

        frame.setSize(600,600);
        frame.setLocation(200,200);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //frame.setBackground(Color.DARK_GRAY);
        //frame.getContentPane().setVisible(false);//虽然上面设置了frame的背景颜色为灰色，但是宽口看到的并不是真正的frame,而是frame上面的
        //contentPane，所以要先将上面的contenPane设置为不可见，就可以见到底层的frame了
        //面板Jpanel可以加入到里面
        frame.addKeyListener(new KeyAdapter() {// addKeyListener是就jframe的一个方法，而里面的KeyAdapter是一个新的类，这里创建了一个新的类作为它的子类
            //当键盘按下时，会自动掉此方法
            @Override
            public void keyPressed(KeyEvent e) {
                //键盘中的一个键都有一个编号
                switch (e.getKeyCode()){

                    case KeyEvent.VK_ENTER: //上键
                        frame.setVisible(false);
                        new MainFrame().setVisible(true);
                        break;

                }
            }
        });
    }

    public static void main(String[] args) {

        MainFrame e=new MainFrame();
        String filepath="ee.wav";
        musicStuff musicObject=new musicStuff();
        musicObject.playMusic(filepath);
        e.gamestart();
    }
}//VK_ENTER

